package com.zynn.message.queue.service;

import org.apache.activemq.ScheduledMessage;
import org.springframework.jms.core.MessagePostProcessor;

import javax.jms.JMSException;
import javax.jms.Message;
import java.util.Objects;

/**
 * @description 延迟推送
 */
public class ScheduleMessagePostProcessor implements MessagePostProcessor {

    /**
     * 毫秒单位，等待多久时间发送到broker
     */
    private Long delay = 0l;

    /**
     * 第一次发送后等待调度的周期调度的时间
     */
    private Long period = 0l;

    /**
     * 重复调度的次数
     */
    private Integer repeat = 0;

    /**
     * cron的配置策略
     */
    private String cron = null;

    /**
     * 延迟推送
     *
     * @param delay  毫秒单位，等待多久时间发送到broker
     * @param period 第一次发送后等待调度的周期调度的时间
     * @param repeat 重复调度的次数
     * @param cron   cron的配置策略
     */
    public ScheduleMessagePostProcessor(Long delay, Long period, Integer repeat, String cron) {
        this.delay = delay;
        this.period = period;
        this.repeat = repeat;
        this.cron = cron;
    }

    @Override
    public Message postProcessMessage(Message message) throws JMSException {
        if (Objects.nonNull(cron) && cron.split(" ").length == 5) {
            //cron的配置策略
            message.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_CRON, cron);
        }
        if (Objects.nonNull(delay) && delay > 0L) {
            //毫秒单位，等待多久时间发送到broker
            message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, delay);
        }
        if (Objects.nonNull(period) && period > 0L) {
            //第一次发送后等待调度的周期调度的时间
            message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, period);
        }
        if (Objects.nonNull(repeat) && repeat > 0) {
            //重复调度的次数
            message.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, repeat);
        }
        return message;
    }
}
